package es.eupt.amazingpi;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import es.eupt.amazingpi.dao.Dummies;
import es.eupt.amazingpi.model.juego.Jugador;
import es.eupt.amazingpi.model.juego.Partida;
import es.eupt.amazingpi.model.usuario.Usuario;
import es.eupt.amazingpi.utils.Constants;

public class PartidasActivity extends Activity {

	private ArrayList<Usuario> listaAmigos;
	private ArrayList<String> listaNombrePartidas;
	private ArrayList<ArrayList<ArrayList<Usuario>>> listaJugadores;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_partidas);
        
        Intent intent = getIntent();
        Bundle parametros = intent.getExtras();
//        listaAmigos = (ArrayList<Usuario>) parametros.get(Constants.PARAMETER_LISTA_AMIGOS);
        listaAmigos = crearListaAmigos();
        AmigosAdapter adp = new AmigosAdapter(this, listaAmigos);
        ListView listView = (ListView)findViewById(android.R.id.list);
        listView.setAdapter(adp);
        listView.setOnItemClickListener(new OnItemClickListener(){

			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				AmigosAdapter adapter = (AmigosAdapter) arg0.getAdapter();
				Usuario usuario = adapter.getItem(arg2);
				Toast.makeText(PartidasActivity.this, "Usuario pulsado: " + usuario.getNombre(), Toast.LENGTH_SHORT).show();
			}
        });
        
//        ArrayList<Partida> listaPartidas = (ArrayList<Partida>) parametros.get(Constants.PARAMETER_LISTA_PARTIDAS);
        ArrayList<Partida> listaPartidas = crearListaPartidas();
        cargarPartidas(listaPartidas);
        PartidasAdapter adapter2 = new PartidasAdapter(this, listaNombrePartidas, listaJugadores);
        ExpandableListView elv  = (ExpandableListView) findViewById(R.id.listaExpandible); 
        elv.setAdapter(adapter2);
        
        elv.setOnChildClickListener(new OnChildClickListener() {
			
			public boolean onChildClick(ExpandableListView parent, View v,
					int groupPosition, int childPosition, long id) {
				PartidasAdapter adapter = (PartidasAdapter) parent.getExpandableListAdapter();
				Usuario usuario = adapter.getChild(groupPosition, childPosition).get(0);
				Toast.makeText(PartidasActivity.this, "Nombre pulsado: "+ usuario.getNombre(), Toast.LENGTH_SHORT).show();
				solicitarJuego(usuario);
				return false;
			}
			
		});
    }

    private ArrayList<Usuario> crearListaAmigos() {
		ArrayList<Usuario> listaAmigos = new ArrayList<Usuario>();
		listaAmigos.add(Dummies.usuario1());
		listaAmigos.add(Dummies.usuario2());
		listaAmigos.add(Dummies.usuario3());
		listaAmigos.add(Dummies.usuario4());
		return listaAmigos;
	}
    
    private ArrayList<Partida> crearListaPartidas(){
    	ArrayList<Partida> listaPartidas = new ArrayList<Partida>();
    	listaPartidas.add(Dummies.partida1());
    	listaPartidas.add(Dummies.partida2());
    	listaPartidas.add(Dummies.partida3());
    	return listaPartidas;
    }

	private void solicitarJuego(Usuario usuario) {
		
	}
    
    private void cargarPartidas(ArrayList<Partida> listaPartidas) {
		listaNombrePartidas = new ArrayList<String>();
		listaJugadores = new ArrayList<ArrayList<ArrayList<Usuario>>>();
		for (int j = 0; j < listaPartidas.size(); j++){
			Partida partida = listaPartidas.get(j);
			Log.d("TAP", "Nombre de la partida en cargarPartidas(): " + partida.getTipoPartida().name());
			listaNombrePartidas.add(partida.getTipoPartida().name());
			listaJugadores.add(new ArrayList<ArrayList<Usuario>>());
			ArrayList<Jugador> jugadores = partida.getJugadores();
			for (int i = 0 ; i < jugadores.size(); i++){
				listaJugadores.get(j).add(new ArrayList<Usuario>());
				listaJugadores.get(j).get(i).add(jugadores.get(i));
			}
		}
		Log.d("TAP", "Nombres de partidas: " + listaNombrePartidas.size());
		Log.d("TAP", "Jugadores: " + listaJugadores.size());
		Log.d("TAP", "Recorremos lista de jugadores");
		for (int i = 0; i < listaJugadores.size(); i++){
			Log.d("TAP", "Partida " + i + ": " + listaJugadores.get(i).size() + " jugadores");
			for (int j = 0; j < listaJugadores.get(i).size(); j++){
				Log.d("TAP", "Jugador " + j + ": " + listaJugadores.get(i).get(j).size() + " subelementos. " + listaJugadores.get(i).get(j).get(0));
			}
		}
	}
	@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_partidas, menu);
        return true;
    }
    
    public class AmigosAdapter extends ArrayAdapter<Usuario> {

    	private final ArrayList<Usuario> listaAmigos;
    	private final Context context;
    	
    	public AmigosAdapter(Context context, ArrayList<Usuario> listaAmigos){
    		super(context, R.layout.listitem_amigo, listaAmigos);
    		this.context = context;
    		this.listaAmigos = listaAmigos;
    	}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			View rowView = inflater.inflate(R.layout.listitem_amigo, parent, false);
			TextView textView = (TextView)rowView.findViewById(R.id.lbl_nombreAmigo);
			textView.setText(listaAmigos.get(position).getNombre());
			Log.d("TAP", listaAmigos.get(position).getNombre());
			TextView icono = (TextView)rowView.findViewById(R.id.img_estadoAmigo);
			switch (listaAmigos.get(position).getEstado()) {
			case AUSENTE:
				icono.setBackgroundColor(Color.YELLOW);
				break;
			case CONECTADO:
				icono.setBackgroundColor(Color.GREEN);
				break;
			case DESCONECTADO:
				icono.setBackgroundColor(Color.GRAY);
				break;
			default:
				break;
			}
			return rowView;
		}
    	
    }
    
    public class PartidasAdapter extends BaseExpandableListAdapter {

    	private ArrayList <String> grupos;
    	private ArrayList <ArrayList<ArrayList<Usuario>>> hijos;
    	private Context context;
    	
    	public PartidasAdapter (Context context, ArrayList<String> grupos, ArrayList<ArrayList<ArrayList<Usuario>>> hijos){
    		this.context = context;
    		this.grupos = grupos;
    		this.hijos = hijos;
    	}
    	
		public ArrayList<Usuario> getChild(int groupPosition, int childPosition) {
			return hijos.get(groupPosition).get(childPosition);
		}

		public long getChildId(int arg0, int arg1) {
			return arg1;
		}

		public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
				ViewGroup parent) {
			Usuario hijo = (Usuario) ((ArrayList<Usuario>)getChild(groupPosition, childPosition)).get(0);
			Log.d("TAP", "hijo obtenido: " + hijo);
			if (convertView == null) {
				LayoutInflater inflater =  (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
				convertView = inflater.inflate(R.layout.listitem_partida_amigo, null);
				Log.d("TAP", "Inflater done");
			}
			TextView textView = (TextView) convertView.findViewById(R.id.lbl_nombreJugador);
			textView.setText(hijo.getNombre());
			Log.d("TAP", hijo.getNombre());
			TextView icono = (TextView)convertView.findViewById(R.id.img_estadoJugador);
			switch (hijo.getEstado()) {
			case AUSENTE:
				icono.setBackgroundColor(Color.YELLOW);
				break;
			case CONECTADO:
				icono.setBackgroundColor(Color.GREEN);
				break;
			case DESCONECTADO:
				icono.setBackgroundColor(Color.GRAY);
				break;
			default:
				break;
			}
			return convertView;
		}

		public int getChildrenCount(int arg0) {
			return hijos.get(arg0).size();
		}

		public String getGroup(int groupPosition) {
			return grupos.get(groupPosition);
		}

		public int getGroupCount() {
			return grupos.size();
		}

		public long getGroupId(int groupPosition) {
			return groupPosition;
		}

		public View getGroupView(int groupPosition, boolean isExpanded,
				View convertView, ViewGroup parent) {
			String nombrePartida = (String) getGroup(groupPosition);
			Log.d("TAP", "Nombre de la partida en getGroupView: " + nombrePartida);
			if (convertView == null){
				LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
				convertView = inflater.inflate(R.layout.listitem_partida, null);
			}
			
			TextView textView = (TextView) convertView.findViewById(R.id.lbl_nombrePartida);
			textView.setText(nombrePartida);
			
			return convertView;
		}

		public boolean hasStableIds() {
			return true;
		}

		public boolean isChildSelectable(int groupPosition, int childPosition) {
			return true;
		}
    	
    }

}
